package top.malaoshi.data;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 封装所有行的数据
 */
public class DataRows implements Iterable<DataRow>{

    /**
     *  所有行的数据
     */
    protected List<DataRow> rowList;

    protected DataTable dt;

    protected DataRows(DataTable dt){
        rowList =new ArrayList<>();
        this.dt = dt;
    }

    /**
     * 添加一行数据
     * @param datas
     */
    public DataRow add(Object[] datas){
        DataRow dr = dt.newRow();

        for( int i = 0,length = datas.length ; i<length;i++) {
            dr.setValue(i,datas[i]);
        }
        rowList.add(dr);
        dr.setRowid(rowList.size()-1);

        dt.indexManager.save(dr);
        return dr;
    }
    public void add(DataRow dataRow){
        if(dt != dataRow.getDataTable()){
            throw new DataNotSupportedException("该 DataRow 是由其他 DataTable 对象创建的，不能添加到此 DataTable 对象中！");
        }
        rowList.add(dataRow);
        dataRow.setRowid(rowList.size()-1);
        dt.indexManager.save(dataRow);
    }
    /**
     * 返回数据的行数
     * @return
     */
    public int count(){
        return rowList.size();
    }

    /**
     * 根据行索引获取行
     * @param rowIndex
     * @return
     */
    public DataRow get(int rowIndex){
        return rowList.get(rowIndex);
    }

    /**
     * 根据 DataRow 对象进行删除
     * 同时删除索引值
     * @param dataRow
     */
    public void remove(DataRow dataRow){
        dt.indexManager.remove(dataRow);
        rowList.remove(dataRow);
    }

    /**
     * 根据 行索引进行删除
     * @param rowIndex
     */
    public void remove(int rowIndex){
        DataRow dataRow = rowList.get(rowIndex);
        // 必须调用另一个方法，因为需要删除索引值
        remove(dataRow);
    }
    /**
     * 清空数据
     * 同时要清空索引
     */
    public void clear(){
        this.rowList.clear();
        dt.indexManager.clear();
    }

    /**
     * 该方法慎用
     * @return
     */
    protected List<DataRow> getDataRows(){
        return rowList;
    }

    @Override
    public Iterator iterator() {
        return new It();
    }

    private class It implements Iterator {
        /**
         * 初始位置
         */
        private int pos = -1;
        @Override
        public boolean hasNext() {
            // 下一个位置，小于数组长度，就认为有下一个
            return pos + 1 < rowList.size();
        }
        @Override
        public DataRow next() {
            // 取下一个值
            ++pos;
            DataRow ret = rowList.get(pos);
            return ret;
        }
    }
}
